﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using RESTServicioTecnico_Final.Dominio;
using System.Data.SqlClient;
using System.Messaging;


namespace RESTServicioTecnico_Final.Persistencia
{
    public class OrdenServicioDAO
    {
        public OrdenServicio Crear(OrdenServicio OrdenServicioACrear)
        {
            OrdenServicio OrdenServicioCreado = null;
            string sql = "INSERT INTO t_OrdenServicio (id_ost, fecha_registro, observacion, id_fae) VALUES  (@cod, @fecha, @obs, 3)";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", OrdenServicioACrear.Codigo));
                    com.Parameters.Add(new SqlParameter("@fecha", OrdenServicioACrear.Fecha));
                    com.Parameters.Add(new SqlParameter("@obs", OrdenServicioACrear.Obs));
                    com.ExecuteNonQuery();
                }
            }

            // cola de mensajeria

            string rutaCola = @".\private$\ServicioTecnico";

            if (!MessageQueue.Exists(rutaCola))

                MessageQueue.Create(rutaCola);
            MessageQueue cola = new MessageQueue(rutaCola);
            Message mensaje = new Message();
            mensaje.Label = "Nuevo Orden de Servicio";
            mensaje.Body = new Atributo() { OST = OrdenServicioACrear.Codigo, Placa = OrdenServicioACrear.Obs };
            cola.Send(mensaje);
            Console.ReadLine();

            
            OrdenServicioCreado = Obtener(OrdenServicioACrear.Codigo);
            return OrdenServicioCreado;
        }


        public OrdenServicio Obtener(string codigo)
        {
            OrdenServicio OrdenServicioEncontrado = null;
            string sql = "SELECT a.id_ost, a.fecha_registro, a.observacion, b.placa FROM t_ordenservicio a inner join t_fae b on b.id_fae=a.id_fae WHERE a.id_ost=@cod";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", codigo));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            OrdenServicioEncontrado = new OrdenServicio()
                            {
                                Codigo = (string)resultado["id_ost"],
                                Fecha = (string)resultado["fecha_registro"],
                                Obs = (string)resultado["observacion"],
                                Placa = (string)resultado["placa"]

                            };
                        }
                    }
                }
            }
            return OrdenServicioEncontrado;

        }

        public OrdenServicio Modificar(OrdenServicio OrdenServicioAModificar)
        {
            OrdenServicio OrdenServicioModificado = null;
            string sql = "UPDATE t_OrdenServicio SET fecha_registro=@fecha, observacion=@obs  WHERE id_ost=@cod";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", OrdenServicioAModificar.Codigo));
                    com.Parameters.Add(new SqlParameter("@fecha", OrdenServicioAModificar.Fecha));
                    com.Parameters.Add(new SqlParameter("@obs", OrdenServicioAModificar.Obs));
                    com.ExecuteNonQuery();
                }
            }
            OrdenServicioModificado = Obtener(OrdenServicioAModificar.Codigo);
            return OrdenServicioModificado;
        }

        public void Eliminar(OrdenServicio OrdenServicioAEliminar)
        {
            string sql = "DELETE FROM t_OrdenServicio WHERE id_ost=@cod";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", OrdenServicioAEliminar.Codigo));
                    com.ExecuteNonQuery();
                }
            }
        }

        public List<OrdenServicio> ListarTodos()
            {
                List<OrdenServicio> OrdenServicioEncontrados = new List<OrdenServicio>();
                OrdenServicio OrdenServicioEncontrado = null;
                string sql = "SELECT id_ost, fecha_registro, observacion FROM t_OrdenServicio";
                using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
                {
                    con.Open();
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        using (SqlDataReader resultado = com.ExecuteReader())
                        {
                            while (resultado.Read())
                            {
                                OrdenServicioEncontrado = new OrdenServicio()
                                {
                                    Codigo = (string)resultado["codigo"],
                                    Fecha = (string)resultado["fecha_registro"],
                                    Obs = (string)resultado["obs"]
                                };
                                OrdenServicioEncontrados.Add(OrdenServicioEncontrado);
                            }
                        }
                    }
             }

                return OrdenServicioEncontrados;

        }

        public class Atributo
        {
            public string OST { get; set; }
            public string Placa { get; set; }

        }
    }
}